/*
 * @Author       : Bing Chen chenbing@iocharger.com
 * @Date         : 2024-05-20 17:18:50
 * @LastEditors  : Kangle Zhang zhangkangl@teld.cn
 * @LastEditTime : 2025-03-17 17:45:00
 * @FilePath     : \openchaoji-corelib\secc\utility\OpenChaoJi_secc_utility_pilot.h
 * @Description  : 本文件定义SECC Utility层 Pilot 导引电路识别 模块
 *
 * Copyright (c) 2025 OpenChaoJi
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the icense for the specific language governing permissions and
 * limitations under the License.
 *
 */

#ifndef __OPEN_CHAOJI_SECC_UTILITY_PILOT_H__
#define __OPEN_CHAOJI_SECC_UTILITY_PILOT_H__

#include "../../shared/include/OpenChaoJi_shared.h"
#include "../include/OpenChaoJi_secc_hal.h"



/*等待session模块超时，超时时间大于、等于版本协商时间+1s*/
#define SYSTEM_PILOT_WAIT_SESSION_TIME_OUT 	LINKAGE_CONSULT_MSG_TC_PERIOD + 1000


/**
 * @brief 创建本模块的上下文时需要传入的参数
 */
struct OpenChaoJi_secc_create_info_utility_pilot {
	int tag;

	/**
     * 本SECC使用的系统类型, 目前仅支持A/B两类
    */
    enum OpenChaoJi_secc_gbt27930_type secc_gbt27930_type;
	/**
	 * hal层句柄
	 */
	OpenChaoJi_hal_handle hal_handle;
};

/**
 * @brief 初始化
 *
 * @param info 初始化信息
 * @return 成功返回创建的上下文指针，失败返回NULL。
 */
struct OpenChaoJi_secc_context_utility_pilot * OpenChaoJi_secc_utility_pilot_init(const struct OpenChaoJi_secc_create_info_utility_pilot * info);

/**
 * @brief 销毁
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_secc_utility_pilot_term(struct OpenChaoJi_secc_context_utility_pilot * context);

/**
 * @brief 复位
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_secc_utility_pilot_reset(struct OpenChaoJi_secc_context_utility_pilot * context);

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_B == CONFIG_YES)
/**
 * @brief secc允许充电, B类系统需要, A类无此功能
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 成功返回0，失败返回-1。
 */
int OpenChaoJi_secc_utility_pilot_b_permit_charge(struct OpenChaoJi_secc_context_utility_pilot * context);
#endif


/**
 * @brief 获取secc的导引状态, 用于判断是否连接, 是否已经确认可以充电等(导引方式, 数据通信另外判断)
 * 		  system调用本方法时, 需要确定当前配置的SECC类型后再进行调用, 即该方法二选一调用
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 返回当前导引连接状态
 */

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_A == CONFIG_YES)
enum OpenChaoJi_pilot_status_gbt18487_a OpenChaoJi_secc_utility_pilot_status_a(struct OpenChaoJi_secc_context_utility_pilot * context);
#endif
#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_B == CONFIG_YES)
enum OpenChaoJi_pilot_status_gbt18487_b OpenChaoJi_secc_utility_pilot_status_b(struct OpenChaoJi_secc_context_utility_pilot * context);
#endif

// 以下需要根据 pilot_status 给出引导的合理封装
/**
 * @brief 判断evcc是否连接中(包含能量传输中等各种状态)
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return 已连接返回true，未连接返回false
 */
bool OpenChaoJi_secc_utility_pilot_is_evcc_connected(struct OpenChaoJi_secc_context_utility_pilot * context);

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_B == CONFIG_YES)
/**
 * @brief (B类系统)判断evcc是否允许充电(S2是否闭合)
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return evcc是否允许充电
 */
bool OpenChaoJi_secc_utility_pilot_b_is_evcc_permit_charge(struct OpenChaoJi_secc_context_utility_pilot * context);
/**
 * @brief (B类系统)判断evcc/secc是否都允许充电(S2/S1是否闭合)
 *
 * @param context 系统上下文指针，包含必要的环境信息。
 * @return evcc/secc是否允许充电
 */
bool OpenChaoJi_secc_utility_pilot_b_is_all_permit_charge(struct OpenChaoJi_secc_context_utility_pilot * context);
#endif

#endif
